/****************************************************************************\
 * @file     BR_Locator.c
 * @author   傅帅
 * @date     2019/12/30
 * @brief    全场定位数据解析, 更新全局变量
 *
 ******************************************************************************
 * @attent   通讯协议遵循全场定位系统
 ****************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "string.h"
#include "arm_math.h"
#include "BR_Common.h"

/* 全局变量 */
TaskHandle_t BR_LocatorHandlerTaskHandler;
QueueHandle_t BR_LocatorQueue;
/* 静态变量 */
static uint8_t prvRxBuffer[LOCATOR_RX_MAX_LEN], prvTxBuffer[LOCATOR_TX_MAX_LEN];  // 接收发送缓冲区
static void prvOnLocatorRecv(uint8_t *pData, uint32_t Len);
static void prvLocatorNormalPackageHandler(uint8_t *pMsg);

/* -------------------------------------------------- Public ----------------------------------------------- */
/** @brief 全场定位接收任务本体 **/
void BR_vLocatorHandlerTask(void)
{
    // 接收控制台指令并解析
    uint32_t RxLen;
    uint8_t Sum, *pMsg;                                 // 局部指针用于消息处理
    while(1)
    {
        xQueueReceive(BR_LocatorQueue, &RxLen, portMAX_DELAY);
        pMsg = prvRxBuffer;
        // 校验位校验
        // ...
        prvLocatorNormalPackageHandler(prvRxBuffer);
    }
}

/** @brief 全场定位初始化 **/
void BR_vLocatorInit(void)
{    
    BR_vUsartInitWithDMA(   BR_configLOCATOR_USART, LOCATOR_BAUDRATE, 
                            LOCATOR_TX_MAX_LEN, LOCATOR_TX_PRIO, 
                            LOCATOR_RX_MAX_LEN, LOCATOR_RX_PRIO, prvOnLocatorRecv);
    BR_LocatorQueue = xQueueCreate(1,4);                // Len=1 Size=4Byte    传当前接收帧长度
}

/** @brief 全场定位设定位置与角度 **/
void BR_vLocatorSetAll(float CenterX, float CenterY, float theta)
{    
}

/** @brief 全场定位设定红蓝场 **/
void BR_vLocatorSetField(void)
{
}

/* -------------------------------------------------- Private ----------------------------------------------- */
/** @brief 全场定位对应串口接收回调 **/
static void prvOnLocatorRecv(uint8_t *pData, uint32_t Len)
{
    BaseType_t IfWoken;
    memcpy(prvRxBuffer, pData, Len);                    // 防止Usart中的缓冲区被更改，先复制到自己的缓冲区
    xQueueSendFromISR(BR_LocatorQueue, &Len, &IfWoken); // 向任务发送通知
}

/** @brief 全场定位定位数据帧处理函数 **/
static void prvLocatorNormalPackageHandler(uint8_t *pMsg)
{
}
